﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;

namespace ErickOrlando.Utilidades.Windows
{
    public partial class _PlantillaGestor : _Plantilla
    {

        #region Constructor
        public _PlantillaGestor()
        {
            InitializeComponent();

            txtFiltro.TextChanged += txtFiltro_TextChanged;
            txtFiltro.ButtonClick += (sender, e) => LimpiaFiltro();

            Activated += _PlantillaGestor_Activated;
            Deactivate += _PlantillaGestor_Deactivate;
            KeyPress += _Plantilla_KeyPress;
            DataGridCompleto += _PlantillaGestor_DataGridCompleto;
        } 
        #endregion

        #region Propiedades

        [Description("Criterio de Búsqueda Predeterminado"), Category("Plantilla")]
        public string CriterioBusqueda { get; set; }

        private List<Criterios> m_ListaCriterios = new List<Criterios>();
        /// <summary>
        /// Lista Genérica de los Criterios que se usarán en el Gestor
        /// </summary>
        /// <remarks>Utilice esta propiedad para tener un conjunto de criterios
        /// como cadena de los campos que se utilizarán para hacer búsquedas.
        /// Esta propiedad tiene como fin reemplazar los criterios que antes
        /// se colocaban en la propiedad Tag de los controles.</remarks>
        [Description("Lista Genérica de los Criterios que se usarán en el Gestor"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public List<Criterios> ListaCriterios
        {
            get { return m_ListaCriterios; }
        }

        private int m_NumeroCaracteres = 2;
        /// <summary>
        /// Número de Caracteres mínimo a validar en el cuadro de búsqueda
        /// </summary>
        [Description("Número de Caracteres mínimo a validar en el cuadro de búsqueda"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public int NumeroCaracteres
        {
            get { return m_NumeroCaracteres; }
            set { m_NumeroCaracteres = value; }
        }

        private bool m_AllowNew;
        [Description("Permitir Crear Registros"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public bool AllowNew
        {
            get
            {
                m_AllowNew = (ToolNuevo.Enabled);
                return m_AllowNew;
            }
            set
            {
                ToolNuevo.Enabled = value;
            }
        }

        private bool m_AllowEdit;
        [Description("Permitir Ver/Editar Registros"), Category("Plantilla")]
        public bool AllowEdit
        {
            get
            {
                m_AllowEdit = ToolEditar.Enabled;
                return m_AllowEdit;
            }
            set
            {
                m_AllowEdit = value;
                ToolEditar.Enabled = value;
            }
        }

        private bool m_AllowRemove;
        [Description("Permitir Eliminar Registros"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public bool AllowRemove
        {
            get
            {
                m_AllowRemove = ToolEliminar.Enabled;
                return m_AllowRemove;
            }
            set
            {
                m_AllowRemove = value;
                ToolEliminar.Enabled = value;
            }
        }

        private string m_BotonNuevo;
        [Description("Texto del Botón Nuevo"), Category("Plantilla")]
        public string BotonNuevo
        {
            get
            {
                m_BotonNuevo = ToolNuevo.Caption;
                return m_BotonNuevo;
            }
            set
            {
                m_BotonNuevo = value;
                ToolNuevo.Caption = value;
            }
        }

        private string m_BotonEditar;
        [Description("Texto del Botón Editar"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public string BotonEditar
        {
            get
            {
                m_BotonEditar = ToolEditar.Caption;
                return m_BotonEditar;
            }
            set
            {
                m_BotonEditar = value;
                ToolEditar.Caption = value;
            }
        }

        private string m_BotonEliminar;
        [Description("Texto del Botón Eliminar"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public string BotonEliminar
        {
            get
            {
                m_BotonEliminar = ToolEliminar.Caption;
                return m_BotonEliminar;
            }
            set
            {
                m_BotonEliminar = value;
                ToolEliminar.Caption = value;
            }
        }

        private string m_BotonBuscar;
        [Description("Texto del Botón Buscar"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public string BotonBuscar
        {
            get
            {
                m_BotonBuscar = ToolBuscar.Caption;
                return m_BotonBuscar;
            }
            set
            {
                m_BotonBuscar = value;
                ToolBuscar.Caption = value;
            }
        }

        private string m_BotonActualizar;
        [Description("Texto del Botón Actualizar"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public string BotonActualizar
        {
            get
            {
                m_BotonActualizar = ToolActualizar.Caption;
                return m_BotonActualizar;
            }
            set
            {
                m_BotonActualizar = value;
                ToolActualizar.Caption = value;
            }
        }
        #endregion

        #region Metodos
        /// <summary>
        /// Permite Devolver un Valor entero desde el TxtFiltro
        /// </summary>
        public int ValorEntero()
        {
            if (Char.IsNumber(txtFiltro.Text, 0))
                return Convert.ToInt32(txtFiltro.Text);
            else
                throw new InvalidOperationException("Ingrese sólo valores numéricos!");
        }
        /// <summary>
        /// Permite Devolver un Valor Decimal desde el TxtFiltro
        /// </summary>
        public decimal ValorDecimal()
        {
            if (Char.IsNumber(txtFiltro.Text, 0))
                return Convert.ToDecimal(txtFiltro.Text);
            else
                throw new InvalidOperationException("Ingrese sólo valores numéricos!");
        }
        #endregion

        #region Barra de Botones
        public virtual void Nuevo()
        {
            Cursor = Cursors.WaitCursor;
        }

        public virtual void Editar()
        {
            Cursor = Cursors.WaitCursor;
        }

        public virtual void Eliminar()
        {
            Cursor = Cursors.WaitCursor;
        }

        public virtual void Buscar()
        {

            if (!txtFiltro.Visible)
                return;

            Cursor = Cursors.WaitCursor;
            var Success = false;
            int cantidad = txtFiltro.Text.Length;
            switch (cantidad)
            {
                case 0:
                    Success = false;
                    break;
                case 1:
                    if (!char.IsDigit(txtFiltro.Text.First()))
                        Success = false;
                    else
                        Success = true;
                    break;
                default:
                    if (!txtFiltro.Visible)
                    {
                        Success = false;
                        break;
                    }

                    if (cantidad < NumeroCaracteres)
                        Success = false;
                    else
                        Success = true;
                    break;
            }

            if (!Success)
                throw new ArgumentException(Properties.Resources.IngresaCriterios);


        }


        public virtual void Actualizar()
        {
        }

        private void Filtro(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Buscar();
                e.Handled = true;
            }
        }

        private void txtFiltro_TextChanged(object sender, System.EventArgs e)
        {
            if (txtFiltro.Visible & Visible)
            {
                if (txtFiltro.Text.IndexOf("%") > -1)
                {
                    txtFiltro.SuspendLayout();
                    txtFiltro.Text = txtFiltro.Text.Replace("%", string.Empty);
                    txtFiltro.ResumeLayout();
                }
            }
        }

        private void LimpiaFiltro()
        {
            txtFiltro.Text = string.Empty;
        }

        private void btnNuevo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Nuevo();
        }

        private void btnEditar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Editar();
        }

        private void btnEliminar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Eliminar();
        }

        private void btnBuscar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Buscar();
        }

        private void btnActualizar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Actualizar();
        }

        private void btnBusqueda_Click(object sender, EventArgs e)
        {
            Buscar();
        }
        #endregion

        #region Formulario

        public override void Formulario(object sender, System.EventArgs e)
        {
            base.Formulario(sender, e);
            if (InfoListDataGridView != null)
                InfoListDataGridView.DoubleClick += (o, s) => Editar();
        }

        private void _PlantillaGestor_Activated(object sender, System.EventArgs e)
        {
            Cursor = Cursors.Arrow;
        }

        private void _PlantillaGestor_DataGridCompleto()
        {
            Cursor = Cursors.Arrow;
        }

        private void _PlantillaGestor_Deactivate(object sender, System.EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
        }

        private void _Plantilla_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            switch (e.KeyChar)
            {
                case (Char)Keys.Escape:
                    Close();
                    break;
                case (Char)(Keys.Enter):
                    Buscar();
                    e.Handled = true;
                    break;
            }
        }

        /// <summary>
        /// Procedimiento que establecerá la Propiedad CriterioBusqueda en base
        /// al indice de la coleccion de ListaCriterios
        /// </summary>
        public virtual void SeleccionaCriterios(Int32 Indice)
        {
            try
            {
                if (this.Visible == false)
                    return;
                txtFiltro.Text = string.Empty;
                txtFiltro.Focus();

                //comprobamos que esté dentro del rango
                if (Indice < ListaCriterios.Count)
                    CriterioBusqueda = ListaCriterios[Indice].Valor;
            }
            catch (Exception)
            {
                throw new InvalidOperationException(Properties.Resources.SeleccionaCriteriosValue);
            }


        }

        #endregion
    }
}
